﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace HPKaraoke
{
    public class Sentence
    {
        /// <summary>
        /// Các từ trong lời bài hát
        /// </summary>
        public List<Word> Words { get; set; }

        /// <summary>
        /// Từ đang hát hiện tại
        /// </summary>
        public Word CurrentWord { get; set; }

        /// <summary>
        /// Chỉ số của từ đang hát hiện tại
        /// </summary>
        private int Indicator { get; set; }


        /// <summary>
        /// Thời điểm bắt đầu câu hát
        /// </summary>
        public TimeSpan TimeToStart { get; set; }


        /// <summary>
        /// Thời gian của cả câu hát
        /// </summary>
        public TimeSpan Duration { get; set; }

        /// <summary>
        /// Dữ liệu thô của câu hát
        /// </summary>
        public string RawData { get; set; }

        /// <summary>
        /// Câu hát đã kết thúc hay chưa
        /// </summary>
        public bool WasEnd { get; set; }


        public string WordWasSinging { get; set; }


        public Sentence(string xmlData)
        {
            WasEnd = false;
            WordWasSinging = "";

            Duration = new TimeSpan();
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlData);
            
            RawData = doc.InnerText;

            XmlNodeList nodeList = doc.SelectNodes(@"//i");
            Words = new List<Word>();
            //int count = 0;
            foreach (var wordNode in nodeList)
            {
                Word w = new Word((wordNode as XmlElement).OuterXml);
                this.Words.Add(w);
                //count++;
                //if (count >= 2)
                //{
                //    TimeSpan delay = Words[count - 1].Time.Subtract(Words[count - 2].Time);
                //    this.Duration += delay;
                //}
            }

            if (Words.Count > 0)
                this.TimeToStart = Words[0].Time;
            else
                this.TimeToStart = new TimeSpan(0, 0, 0);
        }


        /// <summary>
        /// Chuyển sang từ tiếp theo
        /// </summary>
        /// <returns></returns>
        public int GoToNext()
        {
            if (Indicator < Words.Count)
            {
                WordWasSinging += Words[Indicator].Data;
                Indicator++;
                if (Indicator >= Words.Count)
                    return -1;
            }

            return Indicator;
        }

        
        

        /// <summary>
        /// Lấy từ sắp hát hoặc đang hát theo thời gian cho trước
        /// </summary>
        /// <returns></returns>
        public Word GetWordByTimeWithout(TimeSpan time)
        {
            for (int i = 0; i < Words.Count; ++i)
            {
                if (Words[i].Time.Subtract(time).Ticks >= 0)
                {
                    ++i;
                }
                else
                    break;
                Indicator = i;
            }

            if (Indicator < Words.Count)
                return Words[Indicator];
            else
                return null;
        }

        /// <summary>
        /// Lấy từ đang hát tại thời điểm time , với đk Sentence được gọi update thường xuyên
        /// </summary>
        /// <param name="time"></param>
        /// <returns></returns>
        public Word GetWordByTime(TimeSpan time)
        {
            return CurrentWord;
        }

        public void Update(TimeSpan time)
        {
            if (time - this.TimeToStart >= this.Duration)
            {
                EndSentence();
                return;
            }

            for (int i = Indicator; i < Words.Count; ++i)
            {
                if ((time - Words[i].Time).Ticks > 0)
                    if (GoToNext() < 0)
                        break;
            }

                if (Indicator < Words.Count)
                    CurrentWord = Words[Indicator];
                else
                    CurrentWord = null;
        }

        private void EndSentence()
        {
            WasEnd = true;
        }






    
    }
}
